package Logica;

import Datatypes.Archivo;
import Datatypes.ModeloAutoCompletarPersonal;
import autocompletar.logica.DesplegableJPopUPMenu;
import java.awt.Cursor;
import java.awt.Color;
import java.awt.Toolkit;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;

public class JFPrincipal extends javax.swing.JFrame {

    private Publicador publicador = new Publicador();
    private File listaAutocompletadoFile = null;
    private List<String> listaAutocompletado = new ArrayList();
    private String linkServicio = null;
    private String linkWSDL = null;
    private JFProgreso progreso = null;
    
    public JFPrincipal() throws Exception {
    
        initComponents();
        definirVentana();
        cargarlistaAutocompletadoFile();
        cargarAutocompletado();
        cargarPrincipal();
        this.setVisible(true);
    
    }
    
    private void crearProgreso(){
    
        progreso = new JFProgreso();
        progreso.setLocationRelativeTo(this);
        progreso.setVisible(true);
    
    }
    
    private void cargarDatosDePrueba() throws Exception{
            
        crearProgreso();
        JB_CargarDatosDePrueba.setEnabled(false);
        JB_LimpiarBase.setEnabled(false);
        JB_Detener.setEnabled(false);       
        
        Runnable ejecutar = new Runnable(){
        
            @Override
            public void run(){
                
                try{
                
                    publicador.getServicio().cargarDatosDePrueba(false);
                    JB_CargarDatosDePrueba.setEnabled(false);
                    JB_LimpiarBase.setEnabled(true);
                    JB_Detener.setEnabled(true);
                    progreso.setVisible(false);
                    progreso.dispose();
            
                }
                
                catch(Exception e){

                    JOptionPane.showMessageDialog(null, e.getMessage(), "Error!", JOptionPane.ERROR_MESSAGE, null);

                }
                    
            }
        
        };
        
        Thread tarea = new Thread(ejecutar);
        
        tarea.start();
    
    }
    
    private void limpiarBD() throws Exception{
    
        crearProgreso();
        JB_CargarDatosDePrueba.setEnabled(false);
        JB_LimpiarBase.setEnabled(false);
        JB_Detener.setEnabled(false);       
        
        Runnable ejecutar = new Runnable(){
        
            @Override
            public void run(){
                
                try{
                
                    publicador.getServicio().limpiarBD();
                    JB_CargarDatosDePrueba.setEnabled(true);
                    JB_LimpiarBase.setEnabled(false);
                    JB_Detener.setEnabled(true);
                    progreso.setVisible(false);
                    progreso.dispose();
            
                }
                
                catch(Exception e){

                    JOptionPane.showMessageDialog(null, e.getMessage(), "Error!", JOptionPane.ERROR_MESSAGE, null);

                }
                    
            }
        
        };
        
        Thread tarea = new Thread(ejecutar);
        
        tarea.start();
    
    }
    
    private void abrirURL(String url){
    
	String os = System.getProperty("os.name").toLowerCase();
        Runtime rt = Runtime.getRuntime();
 
	try{
 
	    if (os.indexOf( "win" ) >= 0) {
 
	        // URLS Incompatibles "page.html#nameLink" 
	        rt.exec( "rundll32 url.dll,FileProtocolHandler " + url);
 
	    } 
            
            else if (os.indexOf( "mac" ) >= 0) {
 
	        rt.exec( "open " + url);
 
            } 
            
            else if (os.indexOf( "nix") >=0 || os.indexOf( "nux") >=0) {
 
	        //Lista de posibles navegadores disponibles para tratar de abrir el link
	        String[] browsers = {"epiphany", "firefox", "mozilla", "konqueror", "netscape","opera","links","lynx"};
 
	        //Formato de comando: "browser1 "url" || browser2 "url" ||..."
	        StringBuilder cmd = new StringBuilder();
	        
                for (int i=0; i<browsers.length; i++){
                    
                    cmd.append(i==0  ? "" : " || ").append(browsers[i]).append(" \"").append(url).append( "\" ");
 
                }
                    
	        rt.exec(new String[] { "sh", "-c", cmd.toString() });
 
            }
            
            else{
            
                JOptionPane.showMessageDialog(this, "No se pudo abrir el link!", "Advertencia!", JOptionPane.WARNING_MESSAGE);
            
            }
            
       }
        
       catch (IOException e) {

            JOptionPane.showMessageDialog(this, e.getMessage(), "Error!", JOptionPane.ERROR_MESSAGE);
            
        }	
    
    }
    
    private void cargarlistaAutocompletadoFile() throws Exception{
    
        listaAutocompletadoFile = new File(System.getProperty("user.dir") + "/Data/listaAutocompletado.obj");
        
        if(!listaAutocompletadoFile.exists()){

            try{
            
                listaAutocompletadoFile.createNewFile();
                Archivo a = new Archivo(listaAutocompletadoFile);
                a.escribirObjetoEnArchivo(listaAutocompletado);
                        
            }
            
            catch(IOException e){
            
                throw e;
            
            }
                
        }
        
        else{
        
            Archivo a = new Archivo(listaAutocompletadoFile);
            listaAutocompletado = (List) a.leerObjetoDeArchivo();
        
        }
    
    }
    
    private void cargarAutocompletado() throws Exception{
    
        JTF_Direccion.setDesplegable(new DesplegableJPopUPMenu(JTF_Direccion));
        
        ModeloAutoCompletarPersonal modelo = new ModeloAutoCompletarPersonal();      
            
        modelo.setListaElementos(listaAutocompletado);
        
        JTF_Direccion.setModelo(modelo);
        JTF_Direccion.getDesplegable().setForeground(new Color(102,153,255));
        
        setLocationRelativeTo(null);
    
    }
    
    private void cargarPrincipal(){
    
        jLabel1.setVisible(true);
        JTF_Direccion.setVisible(true);
        JB_Cerrar.setVisible(true);
        JB_Publicar.setVisible(true);
        JP_Estado.setVisible(false);
        this.setTitle("Servidor Central - Ingrese Datos");
        this.setSize(600, 130);
    
    }
    
    private void cargarSecundario(){
    
        jLabel1.setVisible(false);
        JTF_Direccion.setVisible(false);
        JB_Cerrar.setVisible(false);
        JB_Publicar.setVisible(false);
        this.setTitle("Servidor Central - En linea");
        this.setSize(600, 245);
        JP_Estado.setVisible(true);
    
    }
    
    private void definirVentana(){
    
        int X = Toolkit.getDefaultToolkit().getScreenSize().width;
        int Y = Toolkit.getDefaultToolkit().getScreenSize().height;
        int tX = Math.round(getSize().width);
        int tY = Math.round(getSize().height);
        
        X = (X / 2) - (tX / 2);
        Y = (Y / 2) - (tY / 2);
        
        setLocation(X, Y);
        
    }
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        JTF_Direccion = new autocompletar.logica.AutoCompletar();
        JB_Cerrar = new javax.swing.JButton();
        JB_Publicar = new javax.swing.JButton();
        JP_Estado = new javax.swing.JPanel();
        JL_Estado1 = new javax.swing.JLabel();
        JL_Estado2 = new javax.swing.JLabel();
        JL_Estado3 = new javax.swing.JLabel();
        JL_Estado4 = new javax.swing.JLabel();
        JB_CargarDatosDePrueba = new javax.swing.JButton();
        JB_LimpiarBase = new javax.swing.JButton();
        JB_Detener = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Servidor Central");
        setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        setResizable(false);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosed(java.awt.event.WindowEvent evt) {
                formWindowClosed(evt);
            }
        });

        jLabel1.setText("Direccion de Publicación");

        JTF_Direccion.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                JTF_DireccionKeyReleased(evt);
            }
        });

        JB_Cerrar.setText("Cerrar");
        JB_Cerrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                JB_CerrarActionPerformed(evt);
            }
        });

        JB_Publicar.setText("Publicar");
        JB_Publicar.setEnabled(false);
        JB_Publicar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                JB_PublicarActionPerformed(evt);
            }
        });

        JP_Estado.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));

        JL_Estado1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        JL_Estado1.setText("<html>Dirección del Servidor<html>");
        JL_Estado1.setVerticalAlignment(javax.swing.SwingConstants.TOP);

        JL_Estado2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        JL_Estado2.setVerticalAlignment(javax.swing.SwingConstants.TOP);
        JL_Estado2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                JL_Estado2MouseClicked(evt);
            }
        });

        JL_Estado3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        JL_Estado3.setText("<html>Dirección del WSDL<html>");
        JL_Estado3.setVerticalAlignment(javax.swing.SwingConstants.TOP);

        JL_Estado4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        JL_Estado4.setVerticalAlignment(javax.swing.SwingConstants.TOP);
        JL_Estado4.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                JL_Estado4MouseClicked(evt);
            }
        });

        JB_CargarDatosDePrueba.setText("Cargar Datos de Prueba");
        JB_CargarDatosDePrueba.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                JB_CargarDatosDePruebaActionPerformed(evt);
            }
        });

        JB_LimpiarBase.setText("Limpiar BD");
        JB_LimpiarBase.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                JB_LimpiarBaseActionPerformed(evt);
            }
        });

        JB_Detener.setText("Detener Publicación");
        JB_Detener.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                JB_DetenerActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout JP_EstadoLayout = new javax.swing.GroupLayout(JP_Estado);
        JP_Estado.setLayout(JP_EstadoLayout);
        JP_EstadoLayout.setHorizontalGroup(
            JP_EstadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(JP_EstadoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(JP_EstadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(JL_Estado1, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(JL_Estado2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(JL_Estado3)
                    .addComponent(JL_Estado4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(JB_CargarDatosDePrueba, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(JB_LimpiarBase, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(JB_Detener, javax.swing.GroupLayout.DEFAULT_SIZE, 576, Short.MAX_VALUE))
                .addContainerGap())
        );
        JP_EstadoLayout.setVerticalGroup(
            JP_EstadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(JP_EstadoLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(JL_Estado1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(JL_Estado2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(JL_Estado3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(JL_Estado4)
                .addGap(18, 18, 18)
                .addComponent(JB_LimpiarBase)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(JB_CargarDatosDePrueba)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(JB_Detener)
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(JTF_Direccion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(JB_Cerrar, javax.swing.GroupLayout.PREFERRED_SIZE, 173, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 230, Short.MAX_VALUE)
                        .addComponent(JB_Publicar, javax.swing.GroupLayout.PREFERRED_SIZE, 173, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(0, 0, Short.MAX_VALUE)
                    .addComponent(JP_Estado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(0, 0, Short.MAX_VALUE)))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(JTF_Direccion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(JB_Publicar)
                    .addComponent(JB_Cerrar))
                .addContainerGap(182, Short.MAX_VALUE))
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(0, 39, Short.MAX_VALUE)
                    .addComponent(JP_Estado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(0, 39, Short.MAX_VALUE)))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void JB_CerrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_JB_CerrarActionPerformed
        
        publicador.detenerPublicacion();
        this.dispose();
        System.exit(0);

    }//GEN-LAST:event_JB_CerrarActionPerformed

    private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed

        publicador.detenerPublicacion();
        this.dispose();
        System.exit(0);
        
    }//GEN-LAST:event_formWindowClosed

    private void JTF_DireccionKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_JTF_DireccionKeyReleased

        String texto = JTF_Direccion.getText();
        
        if((texto.length() > 7) && (texto.contains("http://")) && (!texto.contains(" "))){
        
            JB_Publicar.setEnabled(true);
        
        }
        
        else{
        
            JB_Publicar.setEnabled(false);
            
        }

    }//GEN-LAST:event_JTF_DireccionKeyReleased

    private void JB_PublicarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_JB_PublicarActionPerformed

        String direccionServicio = JTF_Direccion.getText();
        
        try{
        
            if(!listaAutocompletado.contains(direccionServicio)){
            
                listaAutocompletado.add(0, direccionServicio);

                Archivo a = new Archivo(listaAutocompletadoFile);

                if(listaAutocompletado.size() < 10){

                    a.escribirObjetoEnArchivo(listaAutocompletado);

                }

                else{

                    String salida = new String();
                    List<String> listaNueva = new ArrayList();

                    Iterator<String> it = listaAutocompletado.iterator();

                    while(it.hasNext()){

                        String linea = it.next();

                        if(it.hasNext()){

                            salida = salida + linea + "\n";
                            listaNueva.add(linea);

                        }

                    }

                    listaAutocompletado = listaNueva;
                    a.escribirObjetoEnArchivo(listaAutocompletado);

                }
                
            }
                
            publicador.publicar(direccionServicio);
            
            if(publicador.getServicio().esVaciaBD()){
            
                JB_LimpiarBase.setEnabled(false);
                JB_CargarDatosDePrueba.setEnabled(true);
            
            }
            
            else{
            
                JB_LimpiarBase.setEnabled(true);
                JB_CargarDatosDePrueba.setEnabled(false);
            
            }
            
            linkServicio = direccionServicio;
            
            String direccionWSDL = direccionServicio + "?wsdl";
            
            linkWSDL = direccionWSDL;
            
            if(direccionServicio.length() > 60){
            
                direccionServicio = direccionServicio.substring(0, 60) + "..." + direccionServicio.substring(direccionServicio.length() - 5, direccionServicio.length());
                direccionWSDL = direccionWSDL.substring(0, 60) + "..." + direccionWSDL.substring(direccionWSDL.length() - 5, direccionWSDL.length());
                            
            }
            
            JL_Estado2.setText("<html><a href = \"" + linkServicio + "\">" + direccionServicio + "</a><html>");
            JL_Estado4.setText("<html><a href = \"" + linkWSDL + "\">" + direccionWSDL + "</a><html>");
            JL_Estado2.setCursor(new Cursor(Cursor.HAND_CURSOR));
            JL_Estado4.setCursor(new Cursor(Cursor.HAND_CURSOR));
            cargarSecundario();

        }
        
        catch(Exception e){
        
            JOptionPane.showMessageDialog(this, e.getMessage(), "Error!", JOptionPane.ERROR_MESSAGE, null);
        
        }
            
    }//GEN-LAST:event_JB_PublicarActionPerformed

    private void JB_DetenerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_JB_DetenerActionPerformed

        publicador.detenerPublicacion();
        cargarPrincipal();
    }//GEN-LAST:event_JB_DetenerActionPerformed

    private void JL_Estado4MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_JL_Estado4MouseClicked

        abrirURL(linkWSDL);

    }//GEN-LAST:event_JL_Estado4MouseClicked

    private void JL_Estado2MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_JL_Estado2MouseClicked

        abrirURL(linkServicio);

    }//GEN-LAST:event_JL_Estado2MouseClicked

    private void JB_LimpiarBaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_JB_LimpiarBaseActionPerformed

        try{
        
            limpiarBD();

        }
        
        catch(Exception e){
        
            JOptionPane.showMessageDialog(this, e.getMessage(), "Error!", JOptionPane.ERROR_MESSAGE, null);
        
        }
            
    }//GEN-LAST:event_JB_LimpiarBaseActionPerformed

    private void JB_CargarDatosDePruebaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_JB_CargarDatosDePruebaActionPerformed
                
        try{
        
            cargarDatosDePrueba();

        }
        
        catch(Exception e){
        
            JOptionPane.showMessageDialog(this, e.getMessage(), "Error!", JOptionPane.ERROR_MESSAGE, null);
        
        }
        
    }//GEN-LAST:event_JB_CargarDatosDePruebaActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton JB_CargarDatosDePrueba;
    private javax.swing.JButton JB_Cerrar;
    private javax.swing.JButton JB_Detener;
    private javax.swing.JButton JB_LimpiarBase;
    private javax.swing.JButton JB_Publicar;
    private javax.swing.JLabel JL_Estado1;
    private javax.swing.JLabel JL_Estado2;
    private javax.swing.JLabel JL_Estado3;
    private javax.swing.JLabel JL_Estado4;
    private javax.swing.JPanel JP_Estado;
    private autocompletar.logica.AutoCompletar JTF_Direccion;
    private javax.swing.JLabel jLabel1;
    // End of variables declaration//GEN-END:variables
}
